"""
表单模板 CRUD 操作
适配原 Flask 项目的查询需求
"""
from typing import List, Optional
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from datetime import datetime, timezone

from  crud.base import CRUDBase
from  models.template import Template
from  schemas.template import TemplateCreate, TemplateUpdate


class CRUDTemplate(CRUDBase[Template, TemplateCreate, TemplateUpdate]):
    """表单模板CRUD操作"""
    
    async def get_all(self, db: AsyncSession) -> List[Template]:
        """
        获取所有模板（用于 /allnames 接口）
        
        Returns:
            所有模板列表，注意返回的是模板对象，而不是模板名称

        """
        result = await db.execute(select(self.model))
        return list(result.scalars().all())
    
    async def get_active(self, db: AsyncSession) -> List[Template]:
        """
        获取所有激活的模板（用于 /allnameswithversion/active 接口）
        
        Returns:
            激活的模板列表
        """
        result = await db.execute(
            select(self.model).where(self.model.is_active == True)
        )
        return list(result.scalars().all())
    
    async def query_by_conditions(
        self,
        db: AsyncSession,
        *,
        name: Optional[str] = None,
        date: Optional[datetime] = None
    ) -> List[Template]:
        """
        条件查询模板（用于 /query 接口）
        
        Args:
            db: 数据库会话
            name: 模板名称
            date: 创建日期（会查询该日期当天的数据）
        
        Returns:
            符合条件的模板列表
        """
        query = select(self.model)
        
        # 如果提供了模板名称--构建查询条件--name等于name
        if name:
            query = query.where(self.model.name == name)
        
        # 如果提供了日期--构建查询条件--created_at大于等于date且小于next_day
        if date:
            # 查询该日期当天的数据（0点到23:59:59）
            from datetime import timedelta
            next_day = date + timedelta(days=1)
            query = query.where(
                self.model.created_at >= date,
                self.model.created_at < next_day
            )
        
        #执行查询--返回的是查询结果集对象
        result = await db.execute(query)
        #result.scalars().all()--将查询结果提取实际数据
        return list(result.scalars().all())
    
    async def toggle_active(
        self,
        db: AsyncSession,
        *,
        template_id: int
    ) -> tuple[Optional[Template], bool]:
        """
        切换模板的激活状态（用于 /deletebyid 接口）
        
        Args:
            db: 数据库会话
            template_id: 模板ID
        
        Returns:
            (模板对象, 新的激活状态) 或 (None, False)
        """
        #简单封装好的方法self.get()--直接返回模型对象
        template = await self.get(db, id=template_id)
        if not template:
            return None, False
        
        # 切换状态
        new_status = not template.is_active#取反--True变成False，False变成True
        template.is_active = new_status
        template.updated_at = datetime.now(timezone.utc)#更新更新时间
        
        db.add(template)#将模板对象添加到数据库会话中
        await db.flush()#刷新数据库--将数据写入数据库--但是不提交事务
        await db.refresh(template)
        #刷新模板对象--功能: 从数据库重新加载template对象的最新数据
        #作用: 确保对象包含数据库中的最新状态，包括自动生成的字段(如ID、时间戳等)
        
        return template, new_status#返回模板对象和新的激活状态
    
    async def update_version(
        self,
        db: AsyncSession,
        *,
        template_id: int,
        version: int
    ) -> tuple[Optional[Template], Optional[str]]:
        """
        更新模板版本号（用于 /updateversion 接口）
        
        Args:
            db: 数据库会话
            template_id: 模板ID
            version: 新版本号
        
        Returns:
            (模板对象, 错误消息) 或 (None, 错误消息)
        """
        template = await self.get(db, id=template_id)
        if not template:
            return None, "模板表不存在"
        
        # 检查模板是否为非活跃状态
        if template.is_active:
            return None, "只有非活跃的模板表才能修改版本号"
        
        # 检查版本号是否在版本历史中--列表/字典
        """ 
        --列表类型：
        version_history = [
        {'version': 1, 'description': '初始版本'},
        {'version': 2, 'description': '更新版本'},
        {'version': 3, 'description': '最新版本'}] 
        
        --字典类型：
        version_history = 
        {'1': {'description': '初始版本', 'date': '2023-01-01'},
        '2': {'description': '更新版本', 'date': '2023-02-01'},
        '3': {'description': '最新版本', 'date': '2023-03-01'}}
        """
        version_history = template.version_history or []
        if isinstance(version_history, list):
            version_exists = any(v.get('version') == version for v in version_history if isinstance(v, dict))
            available_versions = [v.get('version') for v in version_history if isinstance(v, dict)]
        elif isinstance(version_history, dict):
            version_exists = str(version) in version_history
            available_versions = list(version_history.keys())
        else:
            return None, "版本历史格式错误"
        
        if not version_exists:
            return None, f"版本号不存在于模板表的版本历史中，当前可选版本号:{available_versions}"
        
        # 更新版本号
        template.latest_version = version
        template.updated_at = datetime.now(timezone.utc)
        
        db.add(template)
        await db.flush()
        await db.refresh(template)
        
        return template, None


# 创建全局实例
template = CRUDTemplate(Template)

